#函数参数
#定义格式：
'''
def 函数名(形参a,b):   #形式参数即是变量
    函数体
    ……
    return
    
调用格式：
函数名(实参1,2)
'''
#形参事函数定义时规定的参数，仅在函数体内有效
#实参事函数调用时使用的参数，该值将传递给函数

#例1.
def add(a,b):   #a,b为形参
    print(a+b)
add(2,3)        #传递2,3为实参
print('\n')

#函数参数的意义：使函数通用性更强，可以认为是一个模型。




#必选参数、默认参数、可变参数、关键字参数

#1.必选参数：定义了几个，就必须要传递几个
def funb(a,b):
    result = a-b
    print(result)
funb(3,1)      #funb(3) 会报错，函数定义了2个必选参数a,b,传递时缺少1个必选参数。
print('\n')


#2.默认参数：定义时设置，格式是 “形参名=默认值”（变量赋值）
#不传参时，使用定义的默认值，如果传参，则使用实参更新数据。
def funa(a=12):
    print(f'a={a}')
funa()
funa(5)
print('\n')


#3.可变参数：*args 将实参所有的位置参数接收，放置在一个元组中  def funa(*args): 起作用的是*
#接收多个值时，以元组形式接收。
#传递0-任意多个值
def funa1(*args):
    print(args)
    print(type(args))
funa1(0,1,2,3,4,5,6,7,8,9,10)
print('\n')


#4.关键字参数：**kwargs 接受所有的关键字参数，然后将其转换成一个字典赋值给kwargs这个形参。
#格式：def funa(**kwargs)    起作用的是**
#传参格式：形参名key = value(实参)
def funa2(**kwargs):
    print(kwargs)
funa2(name='Wilia',age = 18) #在实参处以 key = value 这样的形式来传参（字典形式）
print('\n')


#5.拓展：命名关键字参数（应用场景：需要限制关键字参数的名字）
#特殊点：需要更新数据，则传参时需要以 key = value 这样的形式来传参
def person(name,age,*,city='Hongkong',job='coder'):
    print(name,age,city,job)
person('Will',18,city='Shanghai',job='eater')  #Will 18 Shanghai eater
person('Will',18,city='Shanghai')              #Will 18 Shanghai coder
print('\n')


#6.拓展：混合参数
#参数定义顺序：必选参数（位置参数）、默认参数、可变参数、命名关键字和关键字参数。

def funa3(a,b=10,*c):
    print(a,b,c)
    print(f'a = {a}')
    print(f'b = {b}')
    print(f'c = {c}')
    print(type(a))
    print(type(b))
    print(type(c))
funa3(1,2,3,4)







